<?php
/**
 * Representa um Perfil que uma Funcao precisa ter. Este Perfil deve possui
 * uma lista de Acoes que representam os privilegios no sistema.
 */
class Perfil implements IObject {
    /**
     * @var MyDb
     */
    public $tMysqli;

    private $IDPerfil;
    private $IDFuncao;
    private $StPerfil;
    private $ArActions;
    private $Funcao;

    public function __construct($IDPerfil, $IDFuncao, $StPerfil, &$tMysqli) {
        $this->IDPerfil = $IDPerfil;
        $this->IDFuncao = $IDFuncao;
        $this->StPerfil = $StPerfil;
        $this->tMysqli = $tMysqli;
    }
    /**
     * @method  loadPermissions
     *
     * Carrega todos os privilegios do perfil
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Dezembro de 2011
     */
    public function loadPermissions() {
        $StSql = TQuery::getSqlPermissaoLoad($this->IDPerfil);
        $tQuery = $this->tMysqli->exec($StSql);
        while( $ArAcao = mysqli_fetch_assoc($tQuery) ) {
            $Acao = new Acao($ArAcao['IDAcao'], $ArAcao['IDPerfil'], $ArAcao['StAcao'], $ArAcao['StDescricao'], $ArAcao['EnRestrito'], $this->tMysqli);
            $Acao->loadPermissionControl();
            $this->ArActions[] = $Acao;
        }
    }

    public function loadPosition() {
        $StSql = TQuery::getSqlPositionLoad($this->IDFuncao);
        $tQuery = $this->tMysqli->exec($StSql);
        while( $ArPositionData = mysqli_fetch_assoc($tQuery) ) {
            $this->Funcao = new Funcao($ArPositionData['IDFuncao'], $ArPositionData['StFuncao'], $this->tMysqli);
        }
    }
    /**
     * @method  hasAction
     *
     * Informa se o Perfil possui uma determinada Acao
     *
     * @param   Acao    $Action     Acao em questao que pode ou nao estar associada ao Perfil
     *
     * @since   Junho de 2012
     * @return  Boolean
     */
    public function hasAction($Action) {
        if( empty($this->ArActions) ) { return false; }
        foreach($this->ArActions as $ActionProfile) {
            if($Action->equals($ActionProfile)) {
                return true;
            }
        }
        return false;
    }

    public function isAbleToAccess( ControleAcao $AccessControl ) {
        foreach($this->ArActions as $Action) {
            if( $Action->allows($AccessControl) ) {
                return true;
            }
        }
        return false;
    }

    public function hasActions() {
        return count($this->ArActions) > 0;
    }

    public function getIDPerfil() {
        return $this->IDPerfil;
    }

    public function setIDPerfil($IDPerfil) {
        $this->IDPerfil = $IDPerfil;
    }

    public function getIDFuncao() {
        return $this->IDFuncao;
    }

    public function setIDFuncao($IDFuncao) {
        $this->IDFuncao = $IDFuncao;
    }

    public function getStPerfil() {
        return $this->StPerfil;
    }

    public function setStPerfil($StPerfil) {
        $this->StPerfil = $StPerfil;
    }

    public function getActions() {
        return $this->ArActions;
    }

    public function setActions($ArActions) {
        $this->ArActions = $ArActions;
    }

    public function getFuncao() {
        return $this->Funcao;
    }

    public function setFuncao($Funcao) {
        $this->Funcao = $Funcao;
    }

    public function equals(IObject $Object) {
        return $Object->getIDPerfil() == $this->getIDPerfil();
    }

}

?>
